home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 1996 April
/
CHIP 1996 aprilis (CD06).zip
/
CHIP_CD06.ISO
/
hypertxt.arj
/
9510
/
HIEW.CD
< prev
next >
Wrap
Text File
|
1996-03-03
|
15KB
|
229 lines
@VHiew 5.0 beta, IDA 3.04@N
@VSzerszámok bitfaragóknak@N
A programozók meglévô kódjaik böngészésére, patchelésére
többnyire hexa editorokat használnak. Az ASCII--hexa
megjelenítés gyakran mégsem elég, a program logikai
szerkezetéhez jobban illeszkedô vizsgáló eszközökre is
szükség lehet.
Elôször a nézôkék egy speciális fajtáról (pontosabban
ennek egyik képviselôjérôl) lesz szó: ezek elsô ránézésre
szimpla szöveg- és hexa editornak tûnnek, de van bennük
assembler és disassembler is. îgy nemcsak megvizsgálni
tudunk egy-egy programot, hanem rögtön módosíthatjuk is azt.
Ideális kiegészítôi így a különbözô disassembler (Sourcer,
IDA stb.) és debugger (Turbo Debugger, Soft-ICE stb.)
programoknak. Ezek közül az IDA a legkevésbé ismert, pedig
igen hasznos (rövid ismertetôt adunk róla a cikk végén).
Jelenleg az egyik legjobb programbütykölô eszköz a shareware
Hiew 5.0 beta.
@VHiew 5.0 beta@N
A program elsô betöltôdésekor szöveges üzemmódban indul.
Ezen kívül lehetünk még hexa és disassembler üzemmódban is.
A disassembler 386-os utasításokat ismer, és az 5.0 verzió
egyik fô újdonsága az, hogy a beépített assembler is ismer
már 386-os utasításokat. Kérésre file-ba menti az aktuális
üzemmódot -- ezért említettem, hogy elsô indításakor kezdünk
szöveges módban.
Tehát elindult a Hiew, és szöveges üzemmódban van. A
program kiválóan használható erre is, ugyanis meglehetôsen
sokféle sorvég-megadási módot ismer, a DOS CR/LF-jét, a Unix
CR-jét, a Macintosh-os LF-et, végül a C stílusú 0-s ASCII
kódú jelet.
A Hiew keresni is tud, mégpedig meglepôen gyorsan.
Például a Volkov Commandernél majdnem kétszer gyorsabb (ezt
a DOOM2.WAD file-on mértem le). Gyorsasága azért is meglepô,
mert a legtöbb nézôke nagyjából a VC sebességével keres. A
Hiew elôre és hátrafelé is tud keresni, de nem állítható be,
hogy megkülönböztesse a kis- és nagybetûket. Szintén
sajnálatos, hogy nem menti el automatikusan valami kellemes
helyre a keresett stringet. (Már láttam olyan hexa editort,
ami a memóriába, a Volkov Commander keresési stringjébe
mentett.) Nagyon kellemes, hogy a már említett 386-os
assembler itt is használható: assembly utasítások formájában
is megadhatjuk a keresni valót. Ezeket az utasításokat
automatikusan átfordítja hexa megfelelôikre és azokat
keresi.
A keresés leszûkíthetô egy blokkra -- ami azért furcsa,
mert blokkokat csak a hexa és a kód üzemmódban lehet
kijelölni, és ezek nem is látszanak szöveg üzemmódban.
Mindenesetre ha a keresést blokkra szûkítjük, mindenképpen a
blokkban keres, akkor is, ha az nem is látható. Ráadásul az
assembler már itt is mûködik kereséskor -- szemmel láthatóan
egyetlen keresôrutin van, ami független a megjelenítési
módtól.
Ha továbblépünk a szöveges üzemmódból, akkor a hexa
üzemmód következik. Ha már blokkokról volt szó, lássuk
rögtön a lehetôségeket: a blokkok eleje és vége ugyanazzal a
gombbal jelölhetô ki, és a blokk már jelölés közben más
színû. Az elejére és a végére is léphetünk. A végére
ugrással vigyázzunk, mert amíg nincs megjelölve a blokk vége
is, a blokk vége az elejére kerül ilyenkor -- tehát elvész
az eddigi kijelölés. A blokkot kijelölés után kimenthetjük
lemezre és késôbb betölthetjük.
Érdekes dolog adódik a betöltésnél is: a kijelölt
blokkot csak hosszmegjelölésre hasznosítja a Hiew, a
tényleges betöltés a kurzortól történik -- szerintem ez nem
lehetôség, hanem hiba. (Mivel a tesztelt verzió még béta,
ezért ez nem igazán súlyos -- betöltéskor ugorjunk
egyszerûen a blokk elejére.)
Meglepô módon hozzá is tudunk fûzni az adott file-hoz,
ami egyedi mutatvány, de igen hasznos. Figyelnünk kell arra,
hogy ez csak a file végére történhet, és csak akkor, ha nem
vagyunk szerkesztô üzemmódban.
A szerkesztô üzemmód kicsit macerás: a Hiew egyik nagy
hátrányának érzem, hogy külön üzemmód a szerkesztés, és
ilyenkor mintegy ""beragad" a képernyô. Nem lehet egyetlen
képernyônél többet szerkeszteni egyszerre. Elôny viszont,
hogy akár bitenként is szerkeszthetünk egy byte-ot, egy
wordöt vagy dwordöt.
A Hiew legérdekesebb szolgáltatása a @KCrypt@N. Az adott
byte-ot vagy szót elkódoló utasítás(sorozat)ról van szó,
amiben a 8086 aritmetikai utasításait használhatjuk. Mivel
ez a ""program" nem ismételtethetô automatikusan, nagyobb
területek kódolására alkalmatlan, arra kénytelenek vagyunk
valódi, futtatható programot írni.
Több file-t is kezelhetünk egyszerre, de a file-ok
aktuális pozíciójával furcsán bánik a Hiew. Ha átlépünk az
""A" file-ból a ""B"-be, akkor abban ugyanazon az offseten
fogunk állni, mint az ""A"-ban. Ha azonban az ""A" hosszabb,
mint a ""B", és olyan offseten álltunk, ami a ""B"-ben
egyszerûen nem létezik, akkor nullázza ezt a mutatót, és az
""A"-ba visszatérve ott is a file elején találjuk magunkat.
A @KCrypt@N és a keresés beállításai is öröklôdnek file-ról
file-ra, de ez -- az elôbbivel ellentétben -- hasznosnak
tûnik. Szerencsére e hibára is kínál megoldást a Hiew, ami
ráadásul nemcsak a hiba elhárítására használható.
A megoldást a Hiew ""magazin"-nak nevezi. Ebben a
magazinban 8 offset címet tárolhatunk, ezekre tetszôlegesen
visszaléphetünk, ezenkívül törölhetjük az aktuálisat vagy az
összeset. Sajnos nem lehet megtekinteni, hogy melyik milyen
értékû, nem is szerkeszthetôk.
Egy másik ugrálási lehetôség a disassembler módban
használható: a különbözô JMP és CALL utasítások nyomon
követése. Ezek mellé a Hiew zárójelben ír egy számot, az
ennek megfelelô gombot megnyomva tekinthetjük meg az ugrás
célját. Ha nagyon sok ugrás van a képernyôn, akkor a
betûgombokat is igénybe kell venni. Ha 50 soros üzemmódot
állítunk be, elôfordulhat, hogy nem elegendôk a betûk sem --
sajnos ilyenkor nincs mit tenni, egyszerre maximum 35 ugrást
tudunk követni. A késôbbiekben a [0] megnyomásával térhetünk
vissza, összesen maximum 15 alkalommal. Ha például 16 ugrást
követtünk végig, akkor mind a 15 elugrási helyre vissza
tudunk lépni. Ha 17-et, akkor csak egyet tudunk visszalépni.
Errôl se hiszem, hogy szándékos lenne, de ez most így
mûködik.
Mindezekhez természetesen nem árt egy kis dokumentáció.
Ez csak orosz nyelven hozzáférhetô, az on-line help viszont
angol nyelvû. Ez sajnos nem terjed ki mindenre -- például a
Crypthez sincs help. A help csak az adott üzemmódra
vonatkozik, tehát nem lehet egyben átnézni a programból.
Viszont a programon kívül igen: a help egyetlen ASCII
szövegfile.
Összefoglalva: a Hiew kiválóan megfelel a kitûzött
célnak, néhány apró, bár bosszantó hibától eltekintve.
@VIDA 3.04@N
Az IDA egy igen érdekes disassembler -- nemcsak a gép
dolgozik a visszafejtésen, hanem mi is. Az IDA disassembler
része egy legalább 386-os processzort igénylô program, ami
ismer minden processzort és file-formátumot amirôl csak
álmodni lehet. Például processzorok terén a ""triviális"
8086-tól Pentiumig terjedô Intel -- vagy azzal kompatibilis
-- processzorokon túl például a Z80-at, az i860-at és az
i8085-öt is ismeri. A file-ok nem csak sima .EXE vagy .COM
file-ok lehetnek, hanem DOS driverek (.SYS), OS/2, Novell,
Windows file-ok -- sôt a 3.04-es verzió már COFF file-okat
is kezel (ilyeneket DOS alatt a DJGPP produkál, például a
@KDisplay@N egy ismert példa az ilyen programra). Az Intel Hex
formátumot, de még a Borland C overlay-eket is támogatja.
Mindezekbôl képes .EXE, .COM, .BIN file-okat elôállítani,
mert meg is lehet változtatni (patchelni) a betöltött
programot. Tud ASM és a debuggernek MAP file-t készíteni. Az
egészet egy C-szerû nyelven vezérelhetjük. Sajnos ASM-et
generálni csak a regisztrált felhasználók tudnak.
Ezek után szóljunk az érdekesebb részrôl! Elôször is:
hogyan segíthetjük mi az IDA-t, hogy a segítségünkre legyen?
Például ha már rájöttünk, hogy egy szubrutin mit csinál,
akkor beírunk egy megjegyzést erre vonatkozóan, és ez
bekerül a rutin minden egyes meghívása mellé. A
hivatkozásokról az IDA keresztreferencia-táblázatot készít
és tart karban. Ebbe mi is beleszólhatunk (@KEdit/Jump Table@N).
Az IDA automatikusan készít címkéket, de ezeket is
felülírhatjuk (@KEdit/Text/(Re)name current address...@N).
Az IDA-nak nincs külsô dokumentációja, csak belsô
súgója. És ami szerintem igen nagy gond, ez nem is
kereshetô, így ha meg akarunk csinálni valamit, akkor
megkereshetjük a súgóban, ami ugyanolyan szerkezetû, mint a
menük... Tehát akkor már egyszerûbb a menükben megkeresni --
érdemes egyszer végigmenni a menükön, és a számunkra nem
triviális menüpontokról jegyzeteket készíteni. Ez semmi
gondot nem okozhat, mert egy beépített editor is jár az
IDA-hoz. A megjelenés a Borland DOS-os IDE-itôl megszokott
TurboVision.
Térjünk vissza a disassemblerre, mégpedig egy gyakori
problémára: hogyan dönthetô el egy bizonyos adatsorról, hogy
az kód vagy adat? Az IDA természetesen megkísérli kódnak
vagy adatnak értelmezni, de a továbbiban nekünk kell
döntenünk (@KEdit/Analysis@N). Definiálhatjuk kódnak, ASCII
szövegnek, hexa vagy decimális számnak. Sôt,
felderítetlennek is bejelölhetjük, ha például még nem
tudjuk, hogy mire szolgál az adott terület. Az IDA maga is
tesz ilyen jeleket olyan helyekre, melyekre nem talált
semmilyen hivatkozást. Másrészt ha át akarunk definiálni egy
területet mondjuk adatról kódra, akkor elôször törölni kell
az elôzô definíciót (@KUndefine@N).
Elôfordulhat, hogy az IDA maga is kódnak szeretne
értelmezni egy-egy byte-sorozatot, de már korábban bejelölte
adatként. Ilyenkor ez bekerül a problémalistába, és elôször
""üresre" kell definiálnunk, majd ki kell próbálni a kód
opciót. Az erre vonatkozó hibaüzenet sajnos nem egyértelmû:
""Hint: Already defined as data or code". Ez pontosan azt
jelenti, hogy megkísérelte definiálni valaminek, de már volt
ott valami -- a kézi módosítás igénye nélkül viszont könnyen
végtelen ciklusba eshetne a kódvisszafejtô algoritmus, ezért
nem definiálja át automatikusan.
Adat definiálásakor igen hosszú neveket generál az IDA,
amit jobb megváltoztatni. Beállíthatjuk továbbá, hogy milyen
az adat hossza: 1, 2, 4 vagy 10 byte-os. Ez a beállítás nem
expliciten történik, az IDA nem kérdezi meg, hogy az
adatokat DB, DW, DQ vagy DT prefixszel szeretnénk látni, ezt
a @KEdit/Analysis/Data@N menüpont egymás utáni kiválasztása
(vagy a [D] lenyomása) lépteti.
Egy utasítás elsô vagy második argumentumát szükség
szerint kézzel is módosíthatjuk. Az argumentumokról szólva
elôjön egy másik gyakori probléma: például egy @KMOV BX,500@N
utasításról miként dönthetô el, hogy az az @K500@N egy konstans
vagy valaminek az offsetje? Ahol az IDA ezt nem tudja
megtenni, oda ""void" jelzôket tesz. Ezeket késôbb
természetesen végig lehet keresni, és akkor dönteni e
problémáról.
Keresni sok mindenre lehet a @KNavigate@N menü @KSearch for@N
opciójával: az említett ""void" utasításokra, kód- és
adatterületre, szubrutinokra, felderítetlen -- azaz
definiálatlan -- területre, felderített területre,
konstansra, szövegre, problémás területre, és végül a
program ""core"-jában (hex dumpjában) is kutathatunk
valamilyen bináris kód után.
Ha már sikerült megértenünk valamennyit a programból, és
ez elegendônek tûnik egy kívánt módosításhoz, akkor
szerencsére nem kell újrafordítani az egészet --
módosíthatjuk közvetlenül a bináris file-t is. Ehhez az
kell, hogy az aktuális byte-ot vagy wordöt felderítetlennek
definiáljuk, és már lehet is patchelni az @KEdit@N menü @KPatch
@Kcore@N almenüjében.
@KNégyesi Károly@N
@<9510\HIEW2.GIF>■■@N A Hiew ilyet is tud: .EXE fejléc szerkesztése
@<9510\IDA1.GIF>■■@N IDA: egy problémás kódterület javítás elôtt ...
@<9510\ida2.gif>■■@N ...és után